package chapter1_6_yield;

/**
 *
 * s l eep 与y i e ld 方法的区别在于，当线程调用sleep 方法时调用线程会被阻塞挂
 * 起指定的时间，在这期间线程调度器不会去调度该线程。而调用yie ld 方法时，线程只是
 * 让出自己剩余的时间片，并没有被阻塞挂起，而是处于就绪状态，线程调度器下一次调度
 * 时就有可能调度到当前线程执行
 *
 * @author huayuhao
 * @date 2020/12/15 17:02
 */
public class YieldTest implements Runnable{

    YieldTest(){
        // 创建并启动线程
        Thread t = new Thread(this);
        t.start();
    }

    @Override
    public void run() {
        for(int i = 0; i < 5; i ++){
            if(i % 5 == 0){
                System.out.println(Thread.currentThread() +"yield cpu..");
                // 当前线程让出cpu执行权,放弃时间片,进行下一轮调度
                Thread.yield();
            }
        }
        System.out.println(Thread.currentThread() + " is over");
    }

    public static void main(String[] args) {
        new YieldTest();
        new YieldTest();
        new YieldTest();
    }
}
